local respond_to      = require("lapis.application").respond_to
local csrf_tool       = require("utils.csrf_tool")
local capture_errors  = require("lapis.application").capture_errors

return respond_to({
	GET = function(self)
		-- Si un usuario inició sesión, es redireccionado a la página principal.
		if self.session.user then
			return { redirect_to = self:url_for("index") }
		else
			self.website_name = require("utils.website_config").website_name
			self.head_title   = "Iniciar sesión"

			-- Genera un token contra ataques CSRF con tiempo de expiración.
			self.csrf_token = csrf_tool.generate_token(self)

			if self.session.message then
				self.message         = self.session.message
				self.session.message = nil
			end

			return { render = "pages.login" }
		end
	end,
	POST = capture_errors({
		-- Captura y muestra fallos (excepciones) dentro de una plantilla.
		on_error = require('utils.errors'),
		function(self)
			-- Autentifica y valida el tiempo de expiración del token.
			csrf_tool.validation_token(self)

			-- Selecciona los campos de un formulario que solo son necesarios y
			-- elimina espacios sobrantes de inicio y fin.
			local inputs_form = { "identity", "password" }

			local trim = require("lapis.util").trim
			local data = {}

			for index,input in ipairs(inputs_form) do
				data[input] = trim(self.params[input])
			end

			-- Valida los campos de un formulario.			
			local validate = require("utils.validate")

			validate.assert_valid(data, {
				{ "identity", exists = true, min_length = 1, max_length = 255, not_spaces = true, type = "string" },
				{ "password", exists = true, min_length = 6, max_length = 255, not_spaces = true, type = "string" }
			})

			local object = require("controllers.userController")

			-- Valida las credenciales de acceso de un usuario.
			self.session.user,self.session.message = object:userLogin(data)

			if self.session.user then
				if self.session.user.role == 1 or self.session.user.role == 2 then
					--return { redirect_to = self:url_for("dashboard") }
				else
					return { redirect_to = self:url_for("index") }
				end
			else
				return { redirect_to = self:url_for("login") }
			end
		end
	})
})